﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace nl.hanze.i.web.t41
{
    class Mens
    {
        private String naam;
        private DateTime geboortedatum;
        private long bsn;
        private Sexe geslacht;
        private static long laatstebsn=0;
        private static int BSN_LENGTE=15;
        private static Random r = new Random((int)DateTime.Now.Ticks);

        public String Naam
        {
            get { return naam; }
            set { naam = value; }
        }

        public DateTime Geboortedatum
        {
            get { return geboortedatum; }
            set { geboortedatum = value; }
        }

        public String Bsn
        {
            get {
                String sBsn = bsn.ToString();
                String nullen= new String('0', BSN_LENGTE - sBsn.Length);
                return nullen+sBsn;
            }
            set {
                Regex r = new Regex(@"^(0*)(\d+?)$");
                Match m = r.Match(value);
                bsn = int.Parse(m.Groups[2].Value);
            }
        }

        public Sexe Geslacht
        {
            get { return geslacht; }
            set { geslacht = value; }
        }

        public Mens()
        {
            new Mens("", DateTime.Today, Sexe.Man);
        }

        public Mens(String naam, DateTime geboortedatum, Sexe geslacht)
        {
            this.naam = naam;
            this.geboortedatum = geboortedatum;
            this.geslacht = geslacht;
            laatstebsn++;
            this.bsn = laatstebsn;
        }

        public int getLeeftijd()
        {
            DateTime now = DateTime.Today;
            int age = now.Year - geboortedatum.Year;
            if (now.Month < geboortedatum.Month || (now.Month == geboortedatum.Month && now.Day < geboortedatum.Day)) age--;
            return age;
        }


        public static Mens operator +(Mens m1, Mens m2)
        {
            // leeftijd van m1 of m2 lager dan 16 of zelfde geslacht
            if (m1.getLeeftijd() < 16 || m2.getLeeftijd() < 16 || m1.Geslacht == m2.Geslacht)
            {
                throw new GeenZwangeschapMogelijkException("Zwangerschap is niet mogelijk");
            }
            Sexe geslacht = Mens.randomSexe();
            String naam = Mens.randomNaam();
            DateTime geboortedatum = Mens.randomGeboortedatum();

            return new Mens(naam, geboortedatum, geslacht);
        }

        /*
         * random sexe
         */
        public static Sexe randomSexe()
        {
            if (r.Next(0, 1) == 0)
                return Sexe.Man;
            else
                return Sexe.Vrouw;
        }

        /*
         * random naam
         */
        public static String randomNaam()
        {
            String medeklinkers = "wrtpsdfghklzcvbnm";
            String klinkers = "aeiou";
            String naam = "";
            int len = r.Next(3,5);

            for (int i = 0; i < len; i++ )
            {
                naam += medeklinkers[r.Next(medeklinkers.Length)];
                naam += klinkers[r.Next(klinkers.Length)];
            }
            return naam;
        }

        public static DateTime randomGeboortedatum()
        {
            DateTime gd = DateTime.Today;
            gd.AddMonths(9);
            gd.AddDays(r.Next(-14, 14));

            return gd;
        }
    }
}
